home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 February / EnigmA AMIGA RUN 04 (1996)(G.R. Edizioni)(IT)[!][issue 1996-02][Skylink CD III].iso / earcd / patches / xpkdopus.lha / xpkdopus5 / xpkdopus.c < prev    next >
C/C++ Source or Header  |  1995-10-21  |  6KB  |  271 lines

  1. /*
  2.     xpk file (un)packer - special version for DirectoryOpus5 usage
  3.  
  4.     
  5.     Copyright © 1995 by Daniel Balster
  6. */
  7.  
  8. #include <exec/exec.h>
  9. #include <dos/dos.h>
  10. #include <libraries/xpk.h>
  11. #include <proto/exec.h>
  12. #include <proto/dos.h>
  13.  
  14. #include <stdio.h>
  15. #include <string.h>
  16.  
  17. #include <rexx/storage.h>
  18. #include <rexx/rxslib.h>
  19.  
  20. struct Library *XpkBase;
  21.  
  22. #define DEBUG 1
  23.  
  24. #ifdef DEBUG
  25. void kprintf(UBYTE *fmt,...);
  26. #define bug kprintf
  27. #define D(X) X
  28. #else
  29. #define D(X)
  30. #endif
  31.  
  32. #define AllocStruct(X)    AllocVec(sizeof(struct X),MEMF_CLEAR|MEMF_PUBLIC)
  33. #define FreeStruct(X)    FreeVec(X)
  34.  
  35. #define ifnot(expr)    if(!(expr))
  36.  
  37. typedef enum { false=0, true=~(false) } bool;
  38.  
  39. extern struct ExecBase *SysBase;
  40.  
  41. LONG __regargs PackFile(struct DosLibrary *DOSBase,struct Library *XpkBase,
  42.                         char *,struct FileInfoBlock *,char *,char *,LONG,char *,LONG,LONG);
  43. LONG __regargs UnPackFile(struct DosLibrary *DOSBase,struct Library *XpkBase,
  44.                           char *,char *,struct FileInfoBlock *,char *);
  45. LONG __asm __saveds ChunkFunc(register __a1 struct XpkProgress *);
  46.  
  47. /**************************/
  48.  
  49. STRPTR lister;
  50. char dopus[32];
  51.  
  52. char buffer[256];
  53.  
  54. LONG __asm __saveds ChunkFunc(register __a1 struct XpkProgress *P)
  55. {
  56.     char result[2];
  57.  
  58.     sprintf(buffer,
  59.     "sys:rexxc/rx \"address %s;options results;"
  60.     "lister set %s progress name '%s (%ld%% gain)';"
  61.     "lister set %s progress count %ld;"
  62.     "lister query %s abort;call export('%08lx'x,RESULT);\"",
  63.     dopus,lister,P->Activity,P->CF,lister,P->Done,lister,result);
  64.     
  65.     if (!Execute (buffer,0,0)) return SIGBREAKF_CTRL_C;
  66.     if (result[0]=='1') return SIGBREAKF_CTRL_C;
  67.  
  68.     return (LONG) SetSignal(0L,SIGBREAKF_CTRL_C)&SIGBREAKF_CTRL_C;
  69. }
  70.  
  71. struct Hook ChunkHook = {{0L},ChunkFunc};
  72.  
  73. /**************************/
  74.  
  75. #define TAGIT(i,t,d) xtags[i].ti_Tag=t; xtags[i].ti_Data=(ULONG)d;
  76. #define ENDIT(i) xtags[i].ti_Tag=TAG_DONE;
  77.  
  78. struct TagItem xtags[10];
  79. struct XpkFib xfib;
  80.  
  81. char buf[108];
  82. char xpkerr[XPKERRMSGSIZE];
  83.  
  84. void __regargs tmpname()
  85. {
  86.  UWORD Index;
  87.  ULONG Addr;
  88.  for (Index=0, Addr=(ULONG)FindTask(NULL); Index<8; Index++, Addr>>=4) buf[Index] = 'A'+(char)(Addr&15);
  89.  (void)strcpy(&buf[8],"..db");
  90.  
  91. }
  92.  
  93. #define ERR_PROTECTED    (1)
  94. #define ERR_MINSIZE        (2)
  95. #define ERR_XPK        (3)
  96. #define ERR_UNPACKED    (4)
  97. #define ERR_PACKED        (5)
  98. #define ERR_NOGAIN        (6)
  99. #define ERR_NODELETE    (7)
  100. #define ERR_NOTRENAMED    (8)
  101. #define ERR_EXAMINE        (9)
  102. #define ERR_OPENFILE    (10)
  103. #define ERR_MEMORY        (11)
  104. #define ERR_ARGS        (12)
  105. #define ERR_CURRENTDIR    (13)
  106.  
  107. STRPTR errors[] = 
  108. {
  109.     0,
  110.     "Source is DELETE protected (D-bit)",
  111.     "File skipped because it is too small",
  112.     0,
  113.     "File is already packed",
  114.     "File is already unpacked",
  115.     "Could not reach any gain",
  116.     "Could not delete source file",
  117.     "Could not rename destination as source",
  118.     "Could not examine source file",
  119.     "Could not open source file",
  120.     "Internal memory allocation failed",
  121.     "Could not parse the arguments",
  122.     "Could not lock the source directory"
  123. };
  124.  
  125. LONG xpack(struct FileInfoBlock *fib,BPTR file,STRPTR lib,STRPTR passwd,LONG minsize)
  126. {
  127.     ULONG size;
  128.  
  129.     if (fib->fib_Protection&FIBF_DELETE) return ERR_PROTECTED;
  130.     if (fib->fib_Size<=minsize) return ERR_MINSIZE;
  131.  
  132.     TAGIT(0,XPK_GetError,xpkerr);
  133.     TAGIT(1,XPK_InFH,file);
  134.     ENDIT(2);
  135.     if (XpkExamine(&xfib,xtags)) return ERR_XPK;
  136.     if (xfib.Type!=XPKTYPE_UNPACKED) return ERR_UNPACKED;    
  137.  
  138.     tmpname();
  139.  
  140.     TAGIT(0,XPK_Password,passwd);
  141.     TAGIT(1,XPK_GetError,xpkerr);
  142.     TAGIT(2,XPK_FindMethod,lib);
  143.     TAGIT(3,XPK_ChunkHook,&ChunkHook);
  144.     TAGIT(4,XPK_FileName,fib->fib_FileName);
  145.     TAGIT(5,XPK_InFH,file);
  146.     TAGIT(6,XPK_OutName,buf);
  147.     TAGIT(7,XPK_GetOutLen,&size);
  148.     ENDIT(8);
  149.     
  150.     if (XpkPack(xtags)) return ERR_XPK;
  151.     
  152.     if (size>fib->fib_Size) { DeleteFile(buf);return ERR_NOGAIN; }
  153.     
  154.     return 0l;
  155. }
  156.  
  157. LONG xunpack(struct FileInfoBlock *fib,BPTR file,STRPTR passwd)
  158. {
  159.     if (fib->fib_Protection&FIBF_DELETE) return ERR_PROTECTED;
  160.  
  161.     TAGIT(0,XPK_GetError,xpkerr);
  162.     TAGIT(1,XPK_InFH,file);
  163.     ENDIT(2);
  164.     if (XpkExamine(&xfib,xtags)) return ERR_XPK;
  165.     if (xfib.Type!=XPKTYPE_PACKED) return ERR_PACKED;    
  166.  
  167.     tmpname();
  168.  
  169.     TAGIT(0,XPK_Password,passwd);
  170.     TAGIT(1,XPK_GetError,xpkerr);
  171.     TAGIT(2,XPK_ChunkHook,&ChunkHook);
  172.     TAGIT(3,XPK_FileName,fib->fib_FileName);
  173.     TAGIT(4,XPK_InFH,file);
  174.     TAGIT(5,XPK_OutName,buf);
  175.     ENDIT(6);
  176.     
  177.     if (XpkUnpack(xtags)) return ERR_XPK;
  178.     
  179.     return 0;
  180. }
  181.  
  182. #define TMPLATE "DIR/A/K,FILE/A/K,LIB=METHOD/K,PASSWD/K,PACK/S,MINSIZE/N/K,LISTER/A/K,REXXPORT/A/K"
  183.  
  184. struct {
  185.     STRPTR    dirname;
  186.     STRPTR    filename;
  187.     STRPTR    libname;
  188.     STRPTR    passwd;
  189.     ULONG    pack;
  190.     ULONG*    minsize;
  191.     STRPTR    handle;
  192.     STRPTR    dopus;
  193. } args = {0};
  194.  
  195. LONG main()
  196. {
  197.     struct RDArgs *rda;
  198.     struct FileInfoBlock *fib;
  199.     BPTR file;
  200.     LONG err=100;
  201.  
  202.     if (!(XpkBase=OpenLibrary(XPKNAME,2l))) return 20;
  203.  
  204.     if(rda = ReadArgs(TMPLATE,(LONG*)&args,0))
  205.     {
  206.         BPTR olddir,dir;
  207.         
  208.         if (dir = Lock(args.dirname,ACCESS_READ))
  209.         {
  210.             olddir = CurrentDir(dir);
  211.             if (fib = AllocVec(sizeof(*fib),MEMF_CLEAR|MEMF_PUBLIC))
  212.             {
  213.                 if (file = Open(args.filename,MODE_OLDFILE))
  214.                 {
  215.                     if (ExamineFH(file,fib))
  216.                     {
  217.                         ULONG mz;
  218.                     
  219.                         if (args.minsize) mz = *args.minsize;
  220.                         else mz = fib->fib_Size-1;
  221.                 
  222.                         lister = args.handle;
  223.                         strcpy(dopus,args.dopus);
  224.                 
  225.                         if (args.pack)
  226.                             err = xpack(fib,file,args.libname,args.passwd,mz);
  227.                         else
  228.                             err = xunpack(fib,file,args.passwd);
  229.                     }
  230.                     else err = ERR_EXAMINE;
  231.                     Close(file);
  232.             
  233.                     if (err==0)
  234.                     {
  235.                         if (fib->fib_Comment[0]) SetComment(buf,fib->fib_Comment);
  236.                         if (fib->fib_Protection) SetProtection(buf,fib->fib_Protection);
  237.                         SetFileDate(buf,&fib->fib_Date);
  238.                         if (!DeleteFile(fib->fib_FileName)) err = ERR_NODELETE;
  239.                         if (!Rename(buf,fib->fib_FileName)) err = ERR_NOTRENAMED;
  240.                     }
  241.                 }
  242.                 else err = ERR_OPENFILE;
  243.                 FreeVec(fib);    
  244.             }
  245.             else err = ERR_MEMORY;
  246.         
  247.             CurrentDir(olddir);
  248.             UnLock(dir);
  249.         }
  250.         else err = ERR_CURRENTDIR;
  251.         
  252.         FreeArgs(rda);
  253.     }
  254.     else err = ERR_ARGS;
  255.  
  256.     if (err)
  257.     {
  258.         char ebuf[128];
  259.     
  260.         if (err==ERR_XPK)
  261.             sprintf(ebuf,"rx \"address %s;dopus request '''%s''' 'Ok'\"",dopus,xpkerr);
  262.         else
  263.             sprintf(ebuf,"rx \"address %s;dopus request '''Error: %s''' 'Ok'\"",dopus,errors[err]);
  264.  
  265.         Execute(ebuf,0,0);
  266.     }
  267.  
  268.     return 0;
  269. }
  270.  
  271.